﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BluetoothServer
{
    public class CalculateIntervals
    {
        int STATIC_KOEFF = 5;
        int change = 0;
        string str;
        Random r = new Random();

        /// <summary>
        /// Рассчитывает и возвращает значение БПМ
        /// </summary>
        public Int16 getBPM(Int16[] array, Int16 nowPosition, int interval)
        {
            Int16 BPM;
            int summOfInterval = 0;
            for (int i = nowPosition - STATIC_KOEFF; i < nowPosition; i++)
            {
                if (i > 0)
                    summOfInterval += array[i];
                else
                    summOfInterval += interval;
            }
            BPM = (Int16)(60000 / (summOfInterval / STATIC_KOEFF));
            return BPM;
        }

        /// <summary>
        /// Рассчитывает и возвращает значение сигмы
        /// </summary>
        public int getUltimateSigmaMedian(Int16[] arrayOfIntervals, Int16 position, int interval)
        {
            int summElememtMinusSrednee = 0;
            for (int i = 0; i < position; i++)
            {
                summElememtMinusSrednee += Math.Abs(arrayOfIntervals[i] - interval);
            }
            int sigma = summElememtMinusSrednee / (position + 1);
            return sigma;
        }

        /// <summary>
        /// Рассчитывает и возвращает значение РР интервала
        /// </summary>
        public Int16 newInterval(Int16[] array, int sigma, Int16 position, int interval)
        {
            double newNormValue = 0;
            for (int i = position - STATIC_KOEFF; i < position; i++)
            {
                if (i >= 0 && changeNone(array, position, interval))
                    newNormValue += array[i];
                else
                    newNormValue += interval;
            }
            newNormValue = newNormValue / STATIC_KOEFF;
            double newElement = newNormValue + (1.5 * sigma) - r.Next(3 * sigma) + 1;
            Int16 newElemetForReturn = (Int16)newElement;
            return newElemetForReturn;
        }

        /// <summary>
        /// проверяет, что текущй интервал не равен предыдущему
        /// </summary>
        private bool changeNone(Int16[] arrayOfIntervals, Int16 currentPositionFromArray, int interval)
        {
            int previous = arrayOfIntervals[currentPositionFromArray - 1];
            int current = interval;
            if ((previous == current) && (change != 0))
                return true;
            else
            {
                change++;
                if (change == STATIC_KOEFF)
                {
                    change = 0;
                    return false;
                }
                else
                {
                    change++;
                    return false;
                }
            }
        }

        /// <summary>
        /// Добавляет РР интервал к массиву интервалов
        /// </summary>
        public Int16 addInterval(Int16[] arrayOfInterval, Int16 currentPositionFromArray, Int16 realInterval)
        {
            arrayOfInterval[currentPositionFromArray] = realInterval;
            currentPositionFromArray++;
            return currentPositionFromArray;
        }
    }
}
